问题

A mapping of digit to letters (just like on the telephone buttons) is given below.

分析

这题其实含义是是枚举所有可能的组合方式。如果题目要求是枚举“23”的所有可能字母组合,我们很好做,2重循环对吧?但是现在难就难在,一开始你不知道输入是什么,你没办法确定组合长度,组合个数,也没办法确定循环层数,这时候怎么办???

思路1:递归

递归一般是解决一些整体不好求的问题。它通过把大问题划小,然后找到一种特定的规律,然后求解。

递归的思路我们很好理解,我们没办法确定整体,我可以先从入手。

假定有个数字串“23456”

  • 假定除了数字’2’的组合已经求出来了,准备求’4’,那我只要把‘4’所代表的’hij’加到之前字符串他们每一个的后面就好。
    ……
  • 一直这样推下去,直到发现6’后面是空的了,那将当前这个字符串加入列表就好了。

思路2:用队列

  1. 一共需要的工人数,就是数字串长度,它决定了产品需要经过几道加工
    1. {
  2. 然后我们看目前有多少个不同的半成品需要加工

  3. 然后就开始加工了,我们获取每个数字对应的字符串长度,这就是工人需要加工的零件个数。这里加工是把每个半成品拿出来,复制多份,然后按上新的零件

    1. String tmp = result.remove();
    2. result.add(tmp+map[pos].charAt(k));

整体代码

这里,我用了size变量来存之前加工好的半成品个数(因为队列会在加工后扩充,size会变化),

  1. for(int j = 0;j < size;j++)

这里ans.peek().length()是取出第一个元素的长度,当长度等于i的时候,说明是当前需要加工的半成品,而加工完后,队列中的每个元素长度都会增加1,所以,这时候循环就会停止。